package cn.zqy.demo2.day03.demo02;

/**
 *  哈希值是一个十进制的整数，由系统随机给出【对象的逻辑地址值，不是存储数据的物理地址】
 *      在Object中有个方法，可以获取对象的hash值。
 *      eg： int hashCode()  ：返回对象的hash值
 *      public native int hashCode() : native表示操作系统方法
 *
 *    String 重写了 hashCode 方法，其 hashCode 值是由内容决定的，而不是地址决定的
 *    hashCode 和 == 是不一样的。 ==比较的是内存地址， 而hashCode是根据【实例变量计算出来的】。
 *    ==判断的是两个引用变量是否指向同一个对象。当两个对象的内容一样，它们的hashcode 就是一样的
 * */
public class Demo02HashCode {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();
        int p1code = p1.hashCode();
        int p2code = p2.hashCode();
        System.out.println(p1code);  // 460141958
        System.out.println(p2code);     // 1163157884

        /*
            toString方法的源码:
                return getClass().getName() + "@" + Integer.toHexString(hashCode());
         */
        System.out.println(p1);  //cn.zqy.demo2.day03.demo02.Person@1b6d3586
        System.out.println(p2);  // cn.zqy.demo2.day03.demo02.Person@4554617c
        System.out.println("=============");

        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println(str1 == str2);  // false
        System.out.println(str1.hashCode());  // 99162322
        System.out.println(str2.hashCode());  // 99162322


        System.out.println("===========");
        Person p3 = new Person("abc");
        Person p4 = new Person("abc");
        int p3code = p3.hashCode();
        int p4code = p4.hashCode();
        System.out.println(p3code);   // 1956725890
        System.out.println(p4code);   // 356573597
        System.out.println(p3.getName().hashCode());  // 96354
        System.out.println(p4.getName().hashCode());  //96354
        System.out.println("=============");

        // 特殊情况
        System.out.println("重地".hashCode());    // 1179395
        System.out.println("通话".hashCode());    // 1179395



    }
}
